/* @flow */

import { parse } from './parser/index'
import { optimize } from './optimizer'
import { generate } from './codegen/index'
import { createCompilerCreator } from './create-compiler'

// `createCompilerCreator` allows creating compilers that use alternative
// parser/optimizer/codegen, e.g the SSR optimizing compiler.
// Here we just export a default compiler using the default parts.
export const createCompiler = createCompilerCreator(function baseCompile (
  template: string,
  options: CompilerOptions
): CompiledResult {
    // 1、解析template模板，转换为ast语法树。利用栈 + 正则匹配，确定标签父子关系。
  const ast = parse(template.trim(), options); 
  if (options.optimize !== false) {
    // 2、对ast树进行标记，主要是标记静态节点，以便在patch时，跳过不会变化的节点。遍历ast树
    optimize(ast, options); 
  }
  // 3、根据ast，生成字符串代码（with语法），然后通过 new Function(code)得到最终的render函数
  const code = generate(ast, options); 
  return {
    ast,
    render: code.render,
    staticRenderFns: code.staticRenderFns
  }
})
